package com.situ.company.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class DBUtil {

	// ����Դ ��ʼ�����ӳ�
	private static DataSource ds;

	static {
		try {
			Properties prop = new Properties();
			// �����ݿ����Ӳ���ͨ��db�����ļ�������
			prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
			try {
				// ��������Դ
				ds = DruidDataSourceFactory.createDataSource(prop);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (IOException e) {
			// ��������ļ������쳣 ��ӡ
			System.out.println("����db�����ļ�ʧ��");
		}

	}

	// ͨ�����ӳ� ��������
	private static Connection getConnection() {
		try {
			return ds.getConnection();
		} catch (Exception e) {
			return null;
		}
	}

	// ִ��DML���Ĺ��߷���
	public static int executeDML(String sql, Object... params) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();// �������ݿ�
			ps = conn.prepareStatement(sql);// ִ��sql���
			if (params != null && params.length > 0) {
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i + 1, params[i]);// �ɱ䳤����ʵ����һ������
				}
			}
			int i = ps.executeUpdate();
			return i;// ���ؽ���� ��Ӱ������
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(null, ps, conn);
		}
		return -1;
	}

		public static Long executeCount(String sql,Object... params){
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs =null;
			try{
				conn = getConnection();
				ps = conn.prepareStatement(sql);
				if (params != null && params.length > 0) {
					for (int i = 0; i < params.length; i++) {
						ps.setObject(i + 1, params[i]);// �ɱ䳤����ʵ����һ������
					}
				}
				rs = ps.executeQuery();
				//保证sql语句只有一行 ，光标只移动一次
				Long l = 0l;
				while (rs.next()){
					 l =rs.getLong(1);
				}

				//返回sql语句第一行的值
				return l;
			}catch(Exception e){
				e.printStackTrace();
			}finally {
				close(rs,ps,conn);
			}
			return 0L;
		}




	// public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
	// public static final String URL = "jdbc:mysql://127.0.0.1:3306/employee";
	// public static final String USENAME ="root";
	// public static final String PASSWORD = "qwe5712389";

	// ��װͨ�õĲ�ѯ����
	public static <T> List<T> executeDQL(String sql, Class<T> c, Object... params) {

		List<T> list = new ArrayList<>();// ����һ���ռ���

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			if (params != null && params.length > 0) {
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i + 1, params[i]);
				}
			}

			rs = ps.executeQuery();// ִ��sql���

			ResultSetMetaData rsmd = rs.getMetaData();// ��ȡ�����Ԫ����

			while (rs.next()) {
				T o = c.newInstance();// ͨ�������������
				// ����Ա������ֵ
				// Field[] fs = c.getDeclaredFields();// ��������г�Ա�����浽����
				// for (Field f : fs) {// ��������������г�Ա����
				// f.setAccessible(true);// ǿ�ƴ򿪳�Ա��������Ȩ��
				// try {

				// ��f.getName() �� ת���»���������ʽ��ȡֵ��Ϊ
				// java�б����� workNo�����ݿ���work_no ��һ��

				// f.set(o, rs.getObject(f.getName()));
				// ����set������������������o �����ͨ�����������б���������
				// } catch (Exception e) {
				// System.out.println("��һ��û�и���ֵ");
				// }
				// }

				for (int i = 0; i < rsmd.getColumnCount(); i++) {// ���ؽ�����м���
					String label = rsmd.getColumnLabel(i + 1);// ��һ�е�����
					try {
						// ��labelת���շ���ȥ������
						Field f = c.getDeclaredField(StringUtil.change(label));// �����е�����ȥ�ҳ�Ա����
						f.setAccessible(true);
						f.set(o, rs.getObject(i + 1));
					} catch (Exception e) {
						System.out.println(label + "这个结果没在类中找到成员变量");
					}
				}
				list.add(o);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(rs, ps, conn);
		}

		return list;
	}

	private static void close(ResultSet rs, PreparedStatement ps, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
